package itheima07;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/*
    使用Lock接口解决线程安全问题
        java.util.concurrent.locks.Lock接口
        抽象方法:
             public abstract void lock() : 获取锁。
             public abstract void unlock() : 释放锁。

        实现类:
            java.util.concurrent.locks.ReentrantLock类
                空参构造:
                    public ReentrantLock()
 */
public class MyTickets implements Runnable{
    //因为100张票,被3个线程共享使用,所以定义在成员位置
    private int tickets = 100;

    //创建Lock接口的实现类对象,作为锁对象,因为定义在成员位置,所以是唯一的
    Lock lock = new ReentrantLock();//多态

    @Override
    public void run() {
        //死循环
        while(true) {
            //上锁
            lock.lock();
            //执行操作共享数据的多条代码
            //(1)判断是否有票
                try {
                    if(tickets>0) {
                        Thread.sleep(30);
                        //(2)有: 出一张票
                        System.out.println("窗口: "+Thread.currentThread().getName()+" 卖出第: "+tickets+" 张票....");
                        //(3)减少一张票
                        tickets--;
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    //释放锁的动作,必须要被执行
                    lock.unlock();

                }
            }

        }

}
